iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Mobile Development

Google Maps SDK for Android 與 GIS App 開發筆記系列 第 15 篇

Day 15: Google Maps SDK for Android–繪製多邊形 Polygon

  • 分享至 

  • xImage
  •  

前言

昨天看完了線段 Polyline,接著要看的是常用在繪製地籍或坵塊的多邊形 (Polygon)。

繪製多邊形

多邊形跟線段一樣,都是由數個經緯度組成,只是多邊形屬於封閉的線段,且會形成內部封閉的區域。

繪製多邊形的邏輯跟線段一樣:

  1. 使用 PolygonOptions 新增組成多邊形的經緯度
  2. 一樣操作 PolygonOptions 調整樣式
  3. 呼叫 GoogleMap.addPolygon(PolygonOptions) 繪製並取得 Polygon 物件。

基本款

/**
 * 基本款 Polygon
 *
 * @param map
 */
private fun addSimplePolygon(map: GoogleMap) {
    val polygonList = listOf(
        LatLng(24.1607, 120.6404),
        LatLng(24.1620, 120.6386),
        LatLng(24.1630, 120.6384),
        LatLng(24.1638, 120.6390),
        LatLng(24.1636, 120.6402),
        LatLng(24.1644, 120.6412),
        LatLng(24.1631, 120.6424),
        LatLng(24.1623, 120.6416),
        LatLng(24.1607, 120.6404)
    )
    val polygonOptions = PolygonOptions()
        .addAll(polygonList)
    map.addPolygon(polygonOptions)
}

上面範例的第一筆與最後一筆經緯度相同,但其實即便第一筆與最後一筆不相同,API 會自動補最後一位,讓多邊形封閉起來。

https://ithelp.ithome.com.tw/upload/images/20230928/20160271H3yc9qNcMX.png

中間有空洞 addHole()

如果是中間有空洞的多邊形,需要使用 addHole() 這個方法,把空洞的經緯度點位加進去。

/**
 * 中間有空洞的 Polygon
 *
 * @param map
 */
private fun addPolygonWithHole(map: GoogleMap) {

    val hole = listOf(
        LatLng(24.1623, 120.6392),
        LatLng(24.1627, 120.6412),
        LatLng(24.1615, 120.6407),
    )

    val polygonList = listOf(
        LatLng(24.1607, 120.6404),
        LatLng(24.1620, 120.6386),
        LatLng(24.1630, 120.6384),
        LatLng(24.1638, 120.6390),
        LatLng(24.1636, 120.6402),
        LatLng(24.1644, 120.6412),
        LatLng(24.1631, 120.6424),
        LatLng(24.1623, 120.6416),
        LatLng(24.1607, 120.6404)
    )

    val polygonOptions = PolygonOptions()
        .addAll(polygonList)
        .addHole(hole)
        .fillColor(Color.GREEN)

    map.addPolygon(polygonOptions)
}

https://ithelp.ithome.com.tw/upload/images/20230928/20160271rWw5gUACXt.png

如果空洞的範圍跟外部重疊,只有內部的會填滿

https://ithelp.ithome.com.tw/upload/images/20230928/201602715N6zDnV6Qq.png

修改 Polygon

已加入的 Polygon 跟 Polyline 一樣,可以呼叫 setPoints() 更新 Polygon。

外觀樣式

填滿顏色

PolygonOptions.fillColor()

fillColor() 的效果不影響,hole 中空的部分,因為中空本來就不會填滿。

另外,fillColor() 的顏色支援不透明。

線段顏色

設定多邊形框線的顏色。

PolygonOptions.strokeColor()

線段寬度

設定多邊形框線的寬度。

PolygonOptions.strokeWidth(20f)

線段圓角

設定多邊形框線的轉折處。

PolygonOptions.strokeJointType(JointType.ROUND)

線段 Pattern

設定多邊形框線的 Pattern。

PolygonOptions.strokePattern(listOf(Dash(20F), Gap(5f)))

綜合範例

/**
 * 帶有樣式的 Polygon
 *
 * @param map
 */
private fun addPolygonWithStyle(map: GoogleMap) {
    val hole = listOf(
        LatLng(24.1623, 120.6392),
        LatLng(24.1627, 120.6412),
        LatLng(24.1615, 120.6407),
    )
    val polygonList = listOf(
        LatLng(24.1607, 120.6404),
        LatLng(24.1620, 120.6386),
        LatLng(24.1630, 120.6384),
        LatLng(24.1638, 120.6390),
        LatLng(24.1636, 120.6402),
        LatLng(24.1644, 120.6412),
        LatLng(24.1631, 120.6424),
        LatLng(24.1623, 120.6416),
        LatLng(24.1607, 120.6404)
    )
    val polygonOptions = PolygonOptions()
        .addAll(polygonList)
        .addHole(hole)
        // 填滿顏色
        .fillColor(Color.parseColor("#90bd4a55"))
        // 線段顏色
        .strokeColor(Color.GREEN)
        // 線段寬度
        .strokeWidth(20f)
        // 線段圓角
        .strokeJointType(JointType.ROUND)
        // 線段 Pattern
        .strokePattern(listOf(Dash(10F), Gap(30f)))
    map.addPolygon(polygonOptions)
}

https://ithelp.ithome.com.tw/upload/images/20230928/20160271YAck0SljYe.png

點擊事件

多邊形跟線段一樣,預設沒有啟用點擊事件,如果需要啟用,要呼叫 Polygon.setClickable(true) 來啟用。

監聽事件是使用 OnPolygonClickListener,呼叫GoogleMap.setOnPolygonClickListener(OnPolygonClickListener) 加入。

小結

以上就是今天的多邊形 Polygon 介紹,操作上跟線段很像,可以變化的外觀設定很多,大家可以根據自身的設計需求多嘗試看看,也歡迎留言討論~

明天見!!/images/emoticon/emoticon08.gif


上一篇
Day 14: Google Maps SDK for Android–繪製線段 Polyline
下一篇
Day 16: Google Maps SDK for Android–繪製圓形 Circle
系列文
Google Maps SDK for Android 與 GIS App 開發筆記 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
orzabczzqq
iT邦新手 5 級 ‧ 2024-01-05 08:09:04

您好,我嘗試著將數千個Polygon繪製在google maps上,但這會造成地圖lag導致移動不順暢,想詢問一下該如何解決呢?謝謝您

建議您使用範圍篩選的方式來繪製 Polygon。

  1. 監聽地圖相機事件
  2. 在 Camera Idle 的狀態下,透過 GoogleMap.getProjection().getVisibleRegion().latLngBounds; 取得螢幕可視的地圖範圍。
  3. 篩選在這個範圍內的 Polygon。
  4. 繪製篩選的結果。

這樣應該可以避免大量繪製導致的效能問題,提升地圖操作的流暢度。

非常感謝您的回答,流暢度有明顯的大幅提升!!/images/emoticon/emoticon12.gif

我要留言

立即登入留言